package com.qifenqian.turbot.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author H
 * @createDate 2018/6/19 10:14
 * @reference
 * @updateDate
 * @description
 * @detail
 * @since
 */
/*
 * TO 字符串工具
 * 1.匹配手机号码
 * 2.把字符串转换为md5加密形式
 * 3.去掉text中的所有空格、换行等／替换text中的所有空格、换行等为newStr
 * 4.判断文本是否为自然数
 * 5.判断文本是否为字母
 * 6.判断文本是否为汉字(只能判断一个字)     *
 */
public class StringUtils {


    /**
     * TO 匹配手机号码
     * 移动号段：139 138 137 136 135 134 147 150 151 152 157 158 159 178 182 183 184 187 188 | 198
     * 联通号段：130 131 132 155 156 185 186 145 176 | 166
     * 电信号段：133 153 173 177 180 181 189 | 199
     * 虚拟运营商号段：170 171
     * 130 131 132 133 134 135 136 137 138 139 145 147 150 151 152 153 155 156 157 158
     * 159 166 170 171 173 176 177 178 180 181 182 183 184 185 186 187 188 189 198 199
     *
     * @param phone 手机号
     * @return 是否是正确的手机号
     */
    public static boolean isPhoneNumber(String phone) {
//        Pattern p = Pattern.compile("^1((3\\d)|(4[57])|(5[^4,\\D])|(6[6])|(7[013678])|(9[89])|(8\\d))\\d{8}$");
        Pattern p = Pattern.compile("^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$");
        Matcher m = p.matcher(phone.trim());
        return m.matches();
    }

    /**
     * 匹配邮箱
     * @param email
     * @return
     */
    public static boolean isEmail(final String email) {
        Pattern p = Pattern.compile("^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$");
        Matcher m = p.matcher(email);
        return m.matches();
    }

    /**
     * TO 判断文本是否为自然数
     *
     * @param text 文本
     * @return
     */
    public static boolean isNaturalNumber(String text) {
        if (text.equals("")) {
            return false;
        } else {
            return Pattern.compile("[0-9]*").matcher(text).matches();
        }
    }

    /**
     * TO 判断文本是否为字母
     *
     * @param text 文本
     * @return
     */
    public static boolean isLetter(String text) {
        return Pattern.compile("[a-zA-Z]").matcher(text).matches();
    }

    /**
     * TO 判断文本是否为汉字(只能判断一个字)
     *
     * @param text 文本
     * @return
     */
    public static boolean isHanzi(String text) {
        return Pattern.compile("[\u4e00-\u9fa5]").matcher(text).matches();
    }


    /**
     * 判断是否是身份证号码
     *
     * @param idCardNumber
     * @return
     */
    public static boolean isIdCard(String idCardNumber) {
        if (idCardNumber.length() != 18) {
            return false;
        }
        char[] numbers = idCardNumber.toCharArray();
        int l_jyw = 0;
        int[] wi = new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};
        char[] checkCodes = new char[]{'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
        for (int i = 0; i < 17; i++) {
            if (numbers[i] < '0' || numbers[i] > '9') {
                return false;
            }
            l_jyw += (numbers[i] - '0') * wi[i];
        }
        l_jyw = l_jyw % 11;
        return checkCodes[l_jyw] == numbers[17];
    }


    /**
     * TO 把字符串转换为md5加密形式
     *
     * @param content 需要加密的内容
     * @return 已加密的内容文本
     */
    public static String toMD5(String content) {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(content.getBytes());
            StringBuilder builder = new StringBuilder();
            for (byte b : digest.digest()) {
                builder.append(Integer.toHexString((b >> 4) & 0xf));
                builder.append(Integer.toHexString(b & 0xf));
            }
            return builder.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * TO 去掉text中的所有空格、换行等
     * 包括空格、制表符、换页符等（每一个空白字符均会被替换）
     *
     * @param text 需要被替换的字符串
     * @return 如, replaceAllChar("a ","w")    ----> 返回"aw"
     */
    public static String replaceAllChar(String text) {
        return text.replaceAll("[\\s+]", "");
    }

    /**
     * TO 替换text中的所有空格、换行等为newStr
     * 包括空格、制表符、换页符等（每一个空白字符均会被替换）
     *
     * @param text   需要被替换的字符串
     * @param newStr 需要将空白字符替换为的字符
     * @return 如, replaceAllChar("a ","w")    ----> 返回"aw"
     */
    public static String replaceAllChar(String text, String newStr) {
        return text.replaceAll("[\\s+]", newStr);
    }


    /**
     * 转换kb到对应单位
     *
     * @param kbSize
     * @return
     */
    public static String formatFileSizeKb(long kbSize) {    //将kb字节转为对应单位
        DecimalFormat df = new DecimalFormat("#.00");
        String sizeStr;
        if (kbSize < 1024) {
            sizeStr = kbSize + "B";
        } else if (kbSize < 1048576) {
            sizeStr = df.format(kbSize / (double) 1024) + "KB";
        } else if (kbSize < 1073741824) {
            sizeStr = df.format(kbSize / (double) 1048576) + "MB";
        } else {
            sizeStr = df.format(kbSize / (double) 1073741824) + "GB";
        }
        return sizeStr;
    }

}
